package com.qf.limit.service.impl;

import cn.hutool.crypto.digest.MD5;
import cn.hutool.extra.pinyin.PinyinUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.limit.commons.exception.ServiceException;
import com.qf.limit.commons.r.Codes;
import com.qf.limit.dao.UserDao;
import com.qf.limit.entity.User;
import com.qf.limit.entity.vo.UserLoginVo;
import com.qf.limit.service.UserService;
import com.sun.org.apache.bcel.internal.classfile.Code;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Collections;
import java.util.List;

/**
 * (User)表服务实现类
 *
 * @author makejava
 * @since 2024-09-10 09:34:08
 */
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
    @Override
    public boolean save(User entity) {
        //密码加密
        //MD5 -> Hash算法（明文->MD5->32字符串形式）
        // password=123456
        //验证用户名是否存在
        User user = this.query().eq("username",entity.getUsername()).one();
        if(user != null){
            //用户名已经存在
            throw new ServiceException(Codes.USER_EXISTS);
        }

        entity.setPassword(MD5.create().digestHex(entity.getPassword()));
        //password=32字符串形式

        //昵称转拼音
        String pinyin = PinyinUtil.getPinyin(entity.getNickname()).replace(" ","");
        entity.setPinyin(pinyin);

        //entity ->1.password 2.多了一个pinyin
        return super.save(entity);
    }

    @Override
    public User queryUserName(String username) {
        User user = this.query().eq("username",username).one();
        return user;
    }

    /**
     *  修改用户密码
     * @param username
     * @param password
     * @return
     */
    @Override
    public int updateUserPassword(String username, String password) {
        this.update().set("password",MD5.create().digestHex(password))
                .eq("username",username)
                .update();
        return 1;
    }

    @Override
    public User queryUsernameAndPassword(UserLoginVo userLoginVo) {
        return this.query()
                .eq("username",userLoginVo.getUsername())
                .eq("password",MD5.create().digestHex(userLoginVo.getPassword()))
                .one();
    }

    @Override
    public List<User> searchUserByKeyword(String keyword) {
        //检查关键词是否有长度，如果关键词有长度，继续，如果没有长度，返回null
        if (!StringUtils.hasLength(keyword))return null;
        //this.query() 指定义一个方法时，它构造返回一个用来构建查询的对象
        return this.query()
                //.lick("nickname",keyword)添加一个查询条件，查询nickname字段中包含有
                //keyword的用户，like通常是用于模糊查询
                .like("nickname",keyword)
                //.or()再次使用逻辑或.连接下一个查询条件
                .or()
                //.lickRight("pinyin",keyword)查询pinyin字段中一关联词为开头进行匹配
                //.lickRight(). 通常是表示右匹配，从字段值的开始与给定字符串进行匹配
                .likeRight("pinyin",keyword)
                .or()
                .like("username",keyword)
                //.list():执行上面的查询并将返回结果列表
                .list();
    }
}

